/*
 * \file Memoizer.inl
 *
 * \author Thibaut ALGRIN
 * \author Emmanuel CARRE
 *
 * \version 1.0
 * \date 14 déc. 2011
 */

#include "ErreurCleAbsente.h"

namespace tp3
{
	/*
	 * \brief Constructeur de la classe
	 * \fn Memoizer(TypeResultat (*fonction)( TypeArgument ), unsigned int taille_maximale_element_cache = 100);
	 */
	template<typename TypeArgument, typename TypeResultat, typename TypeMemoireCache>
	Memoizer<TypeArgument, TypeResultat, TypeMemoireCache>::Memoizer(TypeResultat(*fonction)(
			TypeArgument), unsigned int taille_maximale_element_cache) :
			m_fonction(fonction), m_cache(TypeMemoireCache(taille_maximale_element_cache))
			{
			}
	/*
	 * \brief Surcharche del'operateur ()
	 * \fn TypeResultat operator()(TypeArgument arg);
	 */
	template<typename TypeArgument, typename TypeResultat, typename TypeMemoireCache>
	TypeResultat Memoizer<TypeArgument, TypeResultat, TypeMemoireCache>::operator()(TypeArgument arg)
	{
		try
		{
				return m_cache.lire(arg);
		}
		catch (ErreurCleAbsente&)
		{
				TypeResultat evaluation = m_fonction(arg);
				if (m_cache.nEstPasPlein())
					{
						m_cache.ajouter(arg, evaluation);
					}
				return evaluation;
		}
	}
	/*
	 * \brief Methode permettant de lire le cache: ce qu'à sauvegarder la classe
	 * \fn EnsembleCouples<TypeArgument, TypeResultat> listerCache() const;
	 */
	template<typename TypeArgument, typename TypeResultat, typename TypeMemoireCache>
	EnsembleCouples<TypeArgument, TypeResultat> Memoizer<TypeArgument, TypeResultat, TypeMemoireCache>::listerCache() const
	{
		return m_cache.listerElements();
	}

}
